/**
 * @file    drv_adc.h
 * @author  yhy
 * @brief   芯必达IM94x系列芯片, adc抽象层
 * @version 1.02
 * @date    2025-07-13
 *
 * @copyright Copyright (c) 2025
 *
 * @details
 * Change Logs:
 * Date           Author       Notes
 * 2025-07-13     yhy          the first version V1.00
 * 2025-07-16     yhy          snf_adc_config_t结构体channel_list参数从指针改为数组 V1.01
 * 2025-08-08     yhy          ADC采样周期变为240，太快会一直进入DMA中断导致中断嵌套 V1.02

 *
 */
#ifndef __DRV_ADC_H__
#define __DRV_ADC_H__

#include "common_config.h"

#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>

/* ADC转换结束回调函数 函数指针 */
typedef void (*adc_callback_f)(uint8_t channel, void *param);

/**
 * @brief ADC通道号, 每个ADC有20个通道
 *
 */
typedef enum
{
    ADC_CHANNEL_0  = 0U,
    ADC_CHANNEL_1  = 1U,
    ADC_CHANNEL_2  = 2U,
    ADC_CHANNEL_3  = 3U,
    ADC_CHANNEL_4  = 4U,
    ADC_CHANNEL_5  = 5U,
    ADC_CHANNEL_6  = 6U,
    ADC_CHANNEL_7  = 7U,
    ADC_CHANNEL_8  = 8U,
    ADC_CHANNEL_9  = 9U,
    ADC_CHANNEL_10 = 10U,
    ADC_CHANNEL_11 = 11U,
    ADC_CHANNEL_12 = 12U,
    ADC_CHANNEL_13 = 13U,
    ADC_CHANNEL_14 = 14U,
    ADC_CHANNEL_15 = 15U,
    ADC_CHANNEL_16 = 16U,
    ADC_CHANNEL_17 = 17U,
    ADC_CHANNEL_18 = 18U,
    ADC_CHANNEL_19 = 19U,
    ADC_CHANNEL_MAX,
} snf_adc_channel_e;

/**
 * @brief ADC模式选择
 *
 */
typedef enum
{
    ADC_MODE_SCAN     = 1U, /* 扫描模式 */
    ADC_MODE_CONTINUE = 2U, /* 连续模式 */
} snf_adc_mode_e;

/**
 * @brief ADC实例, 94系列有两个ADC
 *
 */
typedef enum
{
    ADC_INSTANCE_ADC0 = 0U, /* ADC0 */
    ADC_INSTANCE_ADC1 = 1U, /* ADC1 */
    ADC_INSTANCE_MAX,
} snf_adc_instance_e;

/**
 * @brief ADC DMA通道号, 94系列有8个DMA通道, DMA通道号可以任选
 *
 */
typedef enum
{
    ADC_DMA_CHANNEL_0 = 2U,
    ADC_DMA_CHANNEL_1 = 3U,
    ADC_DMA_CHANNEL_2 = 4U,
    ADC_DMA_CHANNEL_3 = 5U,
    ADC_DMA_CHANNEL_4 = 6U,
    ADC_DMA_CHANNEL_5 = 7U,
    ADC_DMA_CHANNEL_6 = 8U,
    ADC_DMA_CHANNEL_7 = 9U,
    ADC_DMA_CHANNEL_MAX,
} snf_adc_dma_channel_e;

/**
 * @brief ADC配置结构体
 *
 */
typedef struct
{
    snf_adc_instance_e    instance;                      /*!< ADC实例 */
    snf_adc_channel_e     channel_list[ADC_CHANNEL_MAX]; /*!< ADC通道号列表 */
    uint8_t               channel_size;                  /*!< ADC注册的通道数量 */
    snf_adc_mode_e        mode;                          /*!< ADC模式 */
    snf_adc_dma_channel_e dma_channel;                   /*!< ADC DMA通道号 */
    int32_t              *adc_sample_buf;                /*!< ADC采样值缓冲区, 采样结果存储在这里 */
    adc_callback_f        callback;                      /*!< ADC转换结束回调函数 */
    void                 *param;                         /*!< ADC转换结束回调函数参数 */
} snf_adc_config_t;

result_e snf_drv_adc_init(const snf_adc_config_t *adc_config);

#endif
